package executer;


import graphique.Connection;
import graphique.Fenetre;

import java.io.IOException;
import java.text.ParseException;
import java.util.Date;
import java.util.Map;

import modele.AutreEvenement;
import modele.Contact;
import modele.Event;
import modele.Owner;
import modele.Reunion;
import xmlGen.Connexion;
import xmlGen.ExportContact;
import xmlGen.JDomModifier;
import xmlGen.JDomParser;
import xmlGen.XMLJdomCreater;

public class Controleur {

	private Connexion connecter;
	private JDomParser parser;
	private XMLJdomCreater xmlfile;
	private JDomModifier modifier;
	private Connection connectPan;
	
	public Controleur() {
		
		connecter = new Connexion();
		parser = new JDomParser();
		modifier = new JDomModifier();
		connectPan = new Connection(this);
	}
	
	/**
	 * Verifie si le login et le mot de passe
	 * saisis sont corrects
	 * 
	 * @param login identifiant de la personne
	 * @param password mot de passe de la personne
	 * @return vrai si le tout est correct, faux sinon
	 */
	public boolean verifyLogger(String login, String password) {
		return connecter.connect(login, password);
	}
	
	/**
	 * Cree un nouveau loggin et mot de passe
	 * 
	 * @param loggin {@link String}
	 * @param pass {@link String}
	 */
	public void createLogger(String loggin, String pass) {
		connecter.addMember(loggin, pass);
	}
	
	/**
	 * Verifie si le loggin est libre
	 * @param loggin {@link String} a verifier
	 * @return vrai si libre, faux sinon
	 */
	public boolean verifyLoggin(String loggin) {
		return connecter.isLogginFree(loggin);
	}
	
	/**
	 * Retourne tous les {@link Contact}s, en associant 
	 * a chaque contact son Id comme clef
	 * 
	 * @return une {@link Map} contenant les contacts
	 */
	public Map<String, Contact> getAllContacts() {
		
		parser.setRoot(xmlfile.getRoot().getChild("Contacts"));
		return parser.getContacts();
	}
	
	/**
	 * Retourne tous les {@link Event}s, en associant 
	 * a chaque evenement son Id comme clef
	 * 
	 * @return une {@link Map} contenant les events
	 */
	public Map<String, Event> getAllEvents() {
		
		parser.setRoot(xmlfile.getRoot().getChild("Events"));
		return parser.getEvents();
	}

	/**
	 * Retourne tous les {@link Event}s dont la date
	 * contient l'argument spcifier, en associant 
	 * a chaque evenement son Id comme clef
	 * 
	 * @param date {@link String} contenant une partie de la date
	 * @return une {@link Map} contenant les events
	 */
	public Event[] getEventsByDate(String date) {
		
		parser.setRoot(xmlfile.getRoot().getChild("Events"));
		return parser.getEventsByDate(date);
	}
	
	/**
	 * Ajoute un nouvel evenement dans la base de donnes
	 * @param data tableau de {@link String}
	 */
	public void ajouterEvent(String[] data) {

		parser.setRoot(xmlfile.getRoot().getChild("Events"));
		int id = parser.getLastIdEvent() + 1;//il faut aller chercher l'id dans la base 
		int annee = Integer.parseInt(data[0]);
		int mois = Integer.parseInt(data[1]);
		int jour = Integer.parseInt(data[2]);
		int heure = Integer.parseInt(data[4]);
		int min = Integer.parseInt(data[5]);
		String desc = data[6];
		if(data[3]=="Reunion") {
			Reunion r = new Reunion(id, annee, mois, jour, heure, min, data[3], desc);
			xmlfile.addEvent(r);
			xmlfile.save();
		} else {
			AutreEvenement ae = new AutreEvenement(id, annee, mois, jour,heure,min, data[3], desc);
			xmlfile.addEvent(ae);
			xmlfile.save();
		}
	}

	
	/**
	 * Ajoute un nouveau contact dans la base de donnes
	 * @param data tableau de {@link String}
	 */
	public void ajouterContact(String[] data) {
		Contact c = new Contact();
		c.setNom(data[0]);
		c.setPrenom(data[1]);
		c.setAdresse(data[2]);
		c.setVille(data[3]);
		c.setPays(data[4]);
		c.setFixe(data[6]);
		c.setPortable(data[5]);
		c.setEmail(data[7]);
		parser.setRoot(xmlfile.getRoot().getChild("Contacts"));
		c.setId(parser.getLastIdContact()+1);
		xmlfile.addContact(c);
		xmlfile.save();
	}
	
	/**
	 * Ouvre ou cree le fichier dont le nom est en parametre
	 * @param name Nom du fichier a ouvrir ou creer
	 */
	public void openFile(String name) {
		
		xmlfile = new XMLJdomCreater(name);
	}
	
	/**
	 * Modifie ou supprime le contact selon 
	 * la nature du booleean remove
	 * @param contact {@link Contact} a modifier
	 * @param remove si a {@link <code>true</code>} supprimer, sinon modifier
	 */
	public void modifierContact(Contact contact, boolean remove) {
		
		modifier.setRoot(xmlfile.getRoot().getChild("Contacts"));
		modifier.modifierContact(contact, remove);
	}
	
	/**
	 * Modifie ou supprime l'evenement selon 
	 * la nature du booleean remove
	 * @param event {@link Event} a modifier
	 * @param remove si a {@link <code>true</code>} supprimer, sinon modifier
	 */
	public void modifierEvent(Event event, boolean remove) {
		
		modifier.setRoot(xmlfile.getRoot().getChild("Events"));
		modifier.modifierEvent(event, remove);
	}

	/**
	 * Exporte l'ensemble des contacts dans
	 * un fichier PDF
	 */
	public void exporterContact() {

		int taille = xmlfile.getFileName().length();
		String fichier = xmlfile.getFileName().substring(0, taille-10) + "contacts.xml";
		parser.setRoot(xmlfile.getRoot().getChild("Contacts"));
		parser.contactsXML(fichier);
		try {
			ExportContact.creerPDF(fichier, "agenda.xsl", "contacts.pdf");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * Retourne le dernier IdEvent
	 * @return entier correspondant au dernier IdEvent
	 */
	public int getMaxIdEvent() {

		modifier.setRoot(xmlfile.getRoot().getChild("Events"));
		return parser.getLastIdEvent();
	}
	
	/**
	 * Retourne le dernier IdContact
	 * @return entier correspondant au dernier IdContact
	 */
	public int getMaxIdContact() {

		modifier.setRoot(xmlfile.getRoot().getChild("Contacts"));
		return parser.getLastIdContact();
	}

	public void newOwner(Map<String, String> data) {
		
		System.out.println("Ajout d'un nouveau compte...");
		String login = data.get("login");
		createLogger(login, data.get("pass"));
		// creation du nouveau fichier xml pour le new comer
		xmlfile = new XMLJdomCreater(login);
		try {
			Date date = Parser.parseToDate(data.get("anniv"));
			Owner owner = new Owner(data.get("nom"), data.get("prenom"), date, login, data.get("pass"));
			xmlfile.addOwner(owner);
			xmlfile.save();
			connectPan.dispose();
			new Fenetre(this);
		} catch (ParseException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {

		//XMLJdomCreater xmlfile = new XMLJdomCreater("Agenda.xml");
		//JDomParser parser = new JDomParser(xmlfile.getRoot().getChild("Contacts"));
		//System.out.println(parser.getLastIdContact());
		/*Contact c = parser.getContact("9");
		if(c!=null) {
			c.afficherContact();
		} else {
			System.out.println("Le contact n'existe pas...");
		}*/
		/*ArrayList<Contact> contacts = parser.getContacts();
		for(Contact c: contacts) {
			c.afficherContact();
		}*/
		/*xmlfile.affiche();
		Contact n = new Contact("Fatou", "Awa", "Villeurbanne", "69100", "France", "toto@tata.fr", "0610070922", "0456125305",9);
		xmlfile.addContact(n);
		Owner owner = new Owner("Mbengue", "Moustapha", new java.util.Date(), "tafa", "taf27ami");
		try {
		xmlfile.addOwner(owner);
		} catch (IOException e) {
		e.printStackTrace();
		}
		Event event = new Reunion(-1, 2009, 11, 6, 14, 15, "Reunion", "Cool ca marche...");
		xmlfile.addEvent(event);
    	//xmlfile.affiche();
    	//JDomModifier modifier = new JDomModifier(xmlfile.getRoot().getChild("Contacts"));
    	//n.setEmail("tapha@univ-lyon1.fr");
    	//modifier.modifierContact(n, true);
		event = new Anniv(0, owner,"Creation d'evenement");
		xmlfile.addEvent(event);
		xmlfile.save();
		Connexion log = new Connexion();
		log.addMember("yy", "zz");
		//System.out.println(log.connect("taf", "taf27ami"));
		log.save();*/
		System.out.println("agenda electronique");
		new Controleur();
		//Connection c = new Connection();
		//c.setVisible(true);
	}

}
